#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qcustomplot.h"
#include "dataclass.h"
#include <QFileDialog>
#include <QDebug>


DataClass *dataC = new DataClass;
QVector<double> xx(7882), ymax(7882), ymin(7882);


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //DataClass *dataC = new DataClass;

    QCustomPlot *customPlot = ui->widget;//customPlot指针指向控件

//    connect(ui->actionWaveform,&QAction::triggered,[=](){
//        QString str = QFileDialog::getOpenFileName(this,"打开文件", "C:/Users/62320/Desktop", "(*.txt)");
//        qDebug()<<str;
//        dataC->txt2dataV(str.toUtf8().data());
//        qDebug()<<"txt to dataVector over";
//        dataC->findMaxMinData(0, dataC->index);
//        /*下面4行都是测试使用的代码，用来检查最大值提取方法是否成功，成功了！*/
////        for (int in = 0;in<500;in++) {
////            qDebug()<<dataC->maxData[in];
////        }
//        qDebug()<<"find max/min/ind over";

//    });


    connect(ui->actionWaveform, &QAction::triggered, this, &MainWindow::waveForm);
    connect(ui->actionHome, &QAction::triggered, this, &MainWindow::homeWaveForm);


    customPlot->setParent(this);
    customPlot->addGraph();
    customPlot->graph(0)->setPen(QPen(Qt::blue));
    //customPlot->graph(0)->setBrush(QBrush(QColor(0, 0, 255, 20)));//下面的半透明
//    QVector<double> x(7882), ymax(7882), ymin(7882);
//    for (int i=0; i<7882; ++i)
//    {
//        x[i] = dataC->indData[i];
//        ymax[i] = dataC->maxData[i];
//        ymin[i] = dataC->minData[i];
//    }
    customPlot->xAxis2->setVisible(true);
    customPlot->xAxis2->setTickLabels(false);
    customPlot->yAxis2->setVisible(true);
    customPlot->yAxis2->setTickLabels(false);
    //将数据点传递到图形
//    customPlot->graph(0)->setData(x, ymax);
//    customPlot->graph(0)->rescaleAxes();

    /*通过下面这句语句，可以屏蔽掉QCustomPlot的鼠标消息*/
    customPlot->setAttribute(Qt::WA_TransparentForMouseEvents, true);

}


void MainWindow::homeWaveForm(){
    dataC->findMaxMinData(0, dataC->index);
    /*下面4行都是测试使用的代码，用来检查最大值提取方法是否成功，成功了！*/
//        for (int in = 0;in<500;in++) {
//            qDebug()<<dataC->maxData[in];
//        }
    qDebug()<<"find max/min/ind over";


    for (int i=0; i<7882; ++i)
    {
        xx[i] = dataC->indData[i];
        ymax[i] = dataC->maxData[i];
        ymin[i] = dataC->minData[i];
    }

    ui->widget->graph(0)->setData(xx, ymax);
    ui->widget->graph(0)->rescaleAxes();
    ui->widget->yAxis->setRange(0, 4096);
    ui->widget->replot();
}


void MainWindow::waveForm(){
    QString str = QFileDialog::getOpenFileName(this,"打开文件", "C:/Users/62320/Desktop", "(*.txt)");
    qDebug()<<str;

    dataC->txt2dataV(str.toUtf8().data());
    qDebug()<<"txt to dataVector over";
    homeWaveForm();

//    dataC->findMaxMinData(0, dataC->index);
//    /*下面4行都是测试使用的代码，用来检查最大值提取方法是否成功，成功了！*/
////        for (int in = 0;in<500;in++) {
////            qDebug()<<dataC->maxData[in];
////        }
//    qDebug()<<"find max/min/ind over";


//    for (int i=0; i<7882; ++i)
//    {
//        xx[i] = dataC->indData[i];
//        ymax[i] = dataC->maxData[i];
//        ymin[i] = dataC->minData[i];
//    }

//    ui->widget->graph(0)->setData(xx, ymax);
//    ui->widget->graph(0)->rescaleAxes();
//    ui->widget->replot();
}



//之前，可以获得准确的鼠标点击与释放时所在的位置参数
//但是，出现了一个很严重的问题：当鼠标在QCustomPlot控件上的鼠标消息无效
//网上给出的原因是：QCustomPlot控件的鼠标消息屏蔽了我写的鼠标消息




void MainWindow::resetRange(){
    //
    float minX,maxX,minY,maxY;

    if(begin_x_val<end_x_val){
        minX = begin_x_val;
        maxX = end_x_val;
    }else{
        minX = end_x_val;
        maxX = begin_x_val;
    }
    if(begin_y_val<end_y_val){
        minY = begin_y_val;
        maxY = end_y_val;
    }else{
        minY = end_y_val;
        maxY = begin_y_val;
    }


    dataC->findMaxMinData(minX,maxX);

    for (int i=0; i<7882; ++i)
    {
        xx[i] = dataC->indData[i];
        ymax[i] = dataC->maxData[i];
        ymin[i] = dataC->minData[i];
    }

    ui->widget->graph(0)->setData(xx, ymax);

    ui->widget->xAxis->setRange(minX, maxX);
    ui->widget->yAxis->setRange(minY, maxY);
    ui->widget->replot();
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    // 如果是鼠标右键按下
    if(event->button() == Qt::RightButton){
        //···
        int x_pos = event->pos().x();
        int y_pos = event->pos().y();

        // 把鼠标坐标点 转换为 QCustomPlot 内部坐标值 （pixelToCoord 函数）
        // coordToPixel 函数与之相反 是把内部坐标值 转换为外部坐标点
        begin_x_val = ui->widget->xAxis->pixelToCoord(x_pos);
        begin_y_val = ui->widget->yAxis->pixelToCoord(y_pos);

        // 然后打印在界面上
        //ui->statusBar->setText(tr("(%1  %2  ||  %3  %4)").arg(x_pos).arg(y_pos).arg(x_val).arg(y_val));
        qDebug()<<"beginWindowX="<<x_pos<<";beginWindowY="<<y_pos<<"***beginPlotX="<<begin_x_val<<";beginPlotY="<<begin_y_val;
    }
//    // 如果是鼠标左键按下
//    else if(event->button() == Qt::LeftButton){
//       //···
//    }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton){
        //···
        int x_pos = event->pos().x();
        int y_pos = event->pos().y();

        // 把鼠标坐标点 转换为 QCustomPlot 内部坐标值 （pixelToCoord 函数）
        // coordToPixel 函数与之相反 是把内部坐标值 转换为外部坐标点
        end_x_val = ui->widget->xAxis->pixelToCoord(x_pos);
        end_y_val = ui->widget->yAxis->pixelToCoord(y_pos);
        qDebug()<<"endWindowX="<<x_pos<<";endWindowY="<<y_pos<<"***endPlotX="<<end_x_val<<";endPlotY="<<end_y_val;

        resetRange();
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}



//目前出现的问题：当点击Qcustomplot下面的区域的时候，也会重新框选。
//拟采用的解决方案：将配置文件采用非模态对话框的方式弹出，然后进行配置

//目前出现的问题：当使用右键时，依旧会框选，并出现bug。
//拟采用的解决方案：当使用右键时，是框选功能
//当使用左键时，功能尚未明确？？？？

//目前要求的功能：鼠标可以拖动波形
//拟采用的解决方案：鼠标左键可以上下左右拖动？？？？
//这里需要注意一个问题，如果是上下拖动，只需要更改range即可
//但是如果是左右拖动，需要重新选点！！！
//如果是可以同时上下左右拖动呢？？？？
